home *** CD-ROM | disk | FTP | other *** search
/ Gigantic Games 2 / Gigantic Games 2.iso / pc / _m_ / minesweeper / field.cc < prev    next >
C/C++ Source or Header  |  1994-12-23  |  5KB  |  197 lines

  1. // This may look like C code, but it is really -*- C++ -*-
  2. ///////////////////////////////////////////////////////////////////////////
  3. //
  4. //  AMIGA Minesweeper - Definition of the Field-object
  5. //
  6. //  (c) 1992 Hubert Feyrer (c9020@rrzc1.rz.uni-regensburg.de)
  7. //
  8. ///////////////////////////////////////////////////////////////////////////
  9.  
  10. #define class _class
  11. #define IntuitionBase IntuiBase
  12. #define GfxBase GraphBase
  13. extern "C" {
  14. # include <stdio.h>
  15. # include <exec/types.h>
  16. # include <utility/tagitem.h>
  17. # include <intuition/gadgetclass.h>
  18. # include <libraries/gadtools.h>
  19. # include <clib/gadtools_protos.h>
  20. # include <clib/intuition_protos.h>
  21. # include <clib/graphics_protos.h>
  22. # include <ctype.h>
  23. }    
  24. #define IntuitionBase IntuitionBase
  25. #define GfxBase GfxBase
  26. #define class class
  27.  
  28. #include "mine.h"
  29. #include "field.h"
  30.  
  31. Gadget *Field::lastgad=NULL;     // Wird in main() auf Ergebnis
  32.                                  // von CreateContext() gesetzt!
  33.  
  34. //
  35. // Klassendefinition für ein Feld des Mine-Programmes
  36. //
  37. Field::Field(int x, int y, int i, int j){
  38.     static struct NewGadget ngad={
  39.     -1,-1,-1,-1,                     /* x, y, w, h */
  40.     NULL,                            /* ng_GadgetText */
  41.     NULL,                            /* font */
  42.     0,                               /* gadget-id */
  43.     PLACETEXT_IN,                    /* flags */
  44.     NULL,                            /* von GetVisualInfo() */
  45.     NULL                             /* userdata */
  46.       };
  47.     
  48.     ngad.ng_VisualInfo = vinfo;
  49.     ngad.ng_TextAttr   = scr->Font;
  50.     (ngad.ng_GadgetText = strcpy(txt," "))[0]=BLANK;
  51.     ngad.ng_LeftEdge   = x;
  52.     ngad.ng_TopEdge    = y;
  53.     ngad.ng_Width      = fxs;
  54.     ngad.ng_Height     = fys;
  55.     
  56.     lastgad=_gad=CreateGadget(BUTTON_KIND,lastgad,&ngad,TAG_END);
  57.     if(_gad==NULL){
  58.     fprintf(stderr,"Field::Field(%d,%d): Fehler in "
  59.         "CreateGadget()!\n",x,y);
  60.     shutdown(20);
  61.     }
  62.     
  63.     _gad->Flags &= ~GFLG_SELECTED;
  64.     _gad->UserData = (APTR)this;
  65.  
  66.     _cnt=0;            // Anzahl Nachbarminen; später!
  67.     _open=0;           // nicht aufgedeckt
  68.     _i=i;              // Spalte im minefield[][]
  69.     _j=j;              // Zeile im minefield[][]
  70.     countdown++;       // 1 Feld mehr zu erforschen
  71. }
  72.  
  73. Field::~Field(void)
  74. {
  75.     // Nichts zu tun???
  76. }
  77.  
  78. //*
  79. //* Feld in Ausgangszustand versetzen
  80. //*
  81. void Field::clear(void)
  82. {
  83.     _open=0;
  84.     _gad->Flags &= ~GFLG_SELECTED;
  85.     _cnt=0;
  86.     txt[0]=BLANK;
  87. }
  88.  
  89.  
  90. //*
  91. //* Feld aufdecken
  92. //*
  93. void Field::open(int show=0)
  94. {
  95.     if(!_open){
  96.     long pos = RemoveGadget(win,_gad);
  97.  
  98.     _open=1;
  99.     if(show){
  100.         if(_cnt==-1){
  101.         _gad->Flags &= ~GFLG_SELECTED;
  102.         txt[0]=BOMB;
  103.         }else{
  104.         _gad->Flags |= GFLG_SELECTED;
  105.         if(!isdigit(txt[0])) txt[0]=BLANK;
  106.         }
  107.     }else{
  108.         _gad->Flags |= GFLG_SELECTED;
  109.         switch(_cnt){
  110.           case -1:
  111.         txt[0] = BOMB;
  112.         break;
  113.           case  0: 
  114.         txt[0] = BLANK;
  115.         break;
  116.           default:
  117.         txt[0] = NUM+_cnt;
  118.         }
  119.     }
  120.     
  121.     AddGadget(win,_gad,pos);
  122.     RefreshGList(_gad,win,NULL,1);
  123.     }
  124. }
  125.  
  126. //*
  127. //* Feld überprüfen; force==1: auch markierte Felder
  128. //*
  129. GameStat Field::check(int force=0)
  130. {
  131.     if(txt[0]==BLANK || force){
  132.     if(!_open){
  133.         if(_cnt==-1) return GAME_LOST;     // BUMM!
  134.         if(force && txt[0]==MARK && _cnt!=-1) minesleft++;
  135.         open();
  136.         if(_cnt==0){
  137.         // rekursives check()en...
  138.         for(int v=0;v<8;v++){
  139.             int vi=_i+validfields[v].dx;
  140.             int vj=_j+validfields[v].dy;
  141.             
  142.             if(inminefield(vi,vj)){
  143.             Field *m=minefield[vi][vj];
  144.             if(m->cnt()!=-1 && !m->_open){
  145.                 // *** Rekursion *** //
  146.                 minefield[vi][vj]->check(1);
  147.                 
  148.                 sprintf(tnumgad,"%04d",minesleft);
  149.                 if(tnumgad[0]=='0') tnumgad[0]=' ';
  150.                 GT_SetGadgetAttrs(numgad,win,NULL,
  151.                           GTTX_Text,tnumgad,
  152.                           TAG_END);
  153.             }
  154.             }
  155.         }
  156.         }
  157.         countdown--;        // 1 Feld weniger zum Sieg
  158.         if(countdown==0) return GAME_WON;
  159.     }
  160.     }
  161.     return GAME_CONT;
  162. }
  163.  
  164. GameStat Field::mark(void)
  165. {
  166.     if(!_open){
  167.     char *t=txt;
  168.     
  169.     // Markierung setzen/löschen
  170.     long pos = RemoveGadget(win,_gad);
  171.     *t = (*t==BLANK)?MARK:BLANK;
  172.     AddGadget(win,_gad,pos);
  173.     RefreshGList(_gad,win,NULL,1);
  174.  
  175.     minesleft+=(*t==MARK)?-1:1;
  176.  
  177.     sprintf(tnumgad,"%04d",minesleft);
  178.     if(tnumgad[0]=='0') tnumgad[0]=' ';
  179.     GT_SetGadgetAttrs(numgad,win,NULL,
  180.               GTTX_Text,tnumgad,
  181.               TAG_END);
  182.     
  183.     RefreshGList(numgad,win,NULL,1);
  184.  
  185.     if(_cnt==-1){
  186.         if(*t==MARK)
  187.           countdown--;        // 1 Feld weniger zum Sieg...
  188.         else
  189.           countdown++;        // ...oder mehr!
  190.         
  191.         if(countdown==0) return GAME_WON;
  192.     }
  193.     }
  194.     
  195.     return GAME_CONT;
  196. }
  197.